/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package controladores;

import controladores.exceptions.IllegalOrphanException;
import controladores.exceptions.NonexistentEntityException;
import controladores.exceptions.PreexistingEntityException;
import entidades.Recursos;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import javax.persistence.Query;
import javax.persistence.EntityNotFoundException;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Root;
import entidades.Lugar;
import entidades.Tiporecursos;
import entidades.Proyecto;
import entidades.Restaurante;
import entidades.Hotel;
import entidades.Solicitudrecurso;
import java.util.ArrayList;
import java.util.List;
import entidades.Vuelo;
import entidades.Reservarecurso;
import entidades.Insumo;
import entidades.Carro;

/**
 *
 * @author Andres
 */
public class RecursosJpaController {

    public RecursosJpaController() {
        emf = Persistence.createEntityManagerFactory("proyectoCongresoPU");
    }
    private EntityManagerFactory emf = null;

    public EntityManager getEntityManager() {
        return emf.createEntityManager();
    }

    public void create(Recursos recursos) throws PreexistingEntityException, Exception {
        if (recursos.getSolicitudrecursoList() == null) {
            recursos.setSolicitudrecursoList(new ArrayList<Solicitudrecurso>());
        }
        if (recursos.getVueloList() == null) {
            recursos.setVueloList(new ArrayList<Vuelo>());
        }
        if (recursos.getReservarecursoList() == null) {
            recursos.setReservarecursoList(new ArrayList<Reservarecurso>());
        }
        if (recursos.getInsumoList() == null) {
            recursos.setInsumoList(new ArrayList<Insumo>());
        }
        if (recursos.getCarroList() == null) {
            recursos.setCarroList(new ArrayList<Carro>());
        }
        EntityManager em = null;
        try {
            em = getEntityManager();
            em.getTransaction().begin();
            Lugar lugar = recursos.getLugar();
            if (lugar != null) {
                lugar = em.getReference(lugar.getClass(), lugar.getRecursosIdrecurso());
                recursos.setLugar(lugar);
            }
            Tiporecursos tiporecursos = recursos.getTiporecursos();
            if (tiporecursos != null) {
                tiporecursos = em.getReference(tiporecursos.getClass(), tiporecursos.getIdtiporecurso());
                recursos.setTiporecursos(tiporecursos);
            }
            Proyecto proyecto = recursos.getProyecto();
            if (proyecto != null) {
                proyecto = em.getReference(proyecto.getClass(), proyecto.getCodigocongreso());
                recursos.setProyecto(proyecto);
            }
            Restaurante restaurante = recursos.getRestaurante();
            if (restaurante != null) {
                restaurante = em.getReference(restaurante.getClass(), restaurante.getRecursosIdrecurso());
                recursos.setRestaurante(restaurante);
            }
            Hotel hotel = recursos.getHotel();
            if (hotel != null) {
                hotel = em.getReference(hotel.getClass(), hotel.getRecursosIdrecurso());
                recursos.setHotel(hotel);
            }
            List<Solicitudrecurso> attachedSolicitudrecursoList = new ArrayList<Solicitudrecurso>();
            for (Solicitudrecurso solicitudrecursoListSolicitudrecursoToAttach : recursos.getSolicitudrecursoList()) {
                solicitudrecursoListSolicitudrecursoToAttach = em.getReference(solicitudrecursoListSolicitudrecursoToAttach.getClass(), solicitudrecursoListSolicitudrecursoToAttach.getSolicitudrecursoPK());
                attachedSolicitudrecursoList.add(solicitudrecursoListSolicitudrecursoToAttach);
            }
            recursos.setSolicitudrecursoList(attachedSolicitudrecursoList);
            List<Vuelo> attachedVueloList = new ArrayList<Vuelo>();
            for (Vuelo vueloListVueloToAttach : recursos.getVueloList()) {
                vueloListVueloToAttach = em.getReference(vueloListVueloToAttach.getClass(), vueloListVueloToAttach.getNumeroVuelo());
                attachedVueloList.add(vueloListVueloToAttach);
            }
            recursos.setVueloList(attachedVueloList);
            List<Reservarecurso> attachedReservarecursoList = new ArrayList<Reservarecurso>();
            for (Reservarecurso reservarecursoListReservarecursoToAttach : recursos.getReservarecursoList()) {
                reservarecursoListReservarecursoToAttach = em.getReference(reservarecursoListReservarecursoToAttach.getClass(), reservarecursoListReservarecursoToAttach.getReservaCodigoreserva());
                attachedReservarecursoList.add(reservarecursoListReservarecursoToAttach);
            }
            recursos.setReservarecursoList(attachedReservarecursoList);
            List<Insumo> attachedInsumoList = new ArrayList<Insumo>();
            for (Insumo insumoListInsumoToAttach : recursos.getInsumoList()) {
                insumoListInsumoToAttach = em.getReference(insumoListInsumoToAttach.getClass(), insumoListInsumoToAttach.getIdinsumo());
                attachedInsumoList.add(insumoListInsumoToAttach);
            }
            recursos.setInsumoList(attachedInsumoList);
            List<Carro> attachedCarroList = new ArrayList<Carro>();
            for (Carro carroListCarroToAttach : recursos.getCarroList()) {
                carroListCarroToAttach = em.getReference(carroListCarroToAttach.getClass(), carroListCarroToAttach.getPlaca());
                attachedCarroList.add(carroListCarroToAttach);
            }
            recursos.setCarroList(attachedCarroList);
            em.persist(recursos);
            if (lugar != null) {
                Recursos oldRecursosOfLugar = lugar.getRecursos();
                if (oldRecursosOfLugar != null) {
                    oldRecursosOfLugar.setLugar(null);
                    oldRecursosOfLugar = em.merge(oldRecursosOfLugar);
                }
                lugar.setRecursos(recursos);
                lugar = em.merge(lugar);
            }
            if (tiporecursos != null) {
                tiporecursos.getRecursosList().add(recursos);
                tiporecursos = em.merge(tiporecursos);
            }
            if (proyecto != null) {
                proyecto.getRecursosList().add(recursos);
                proyecto = em.merge(proyecto);
            }
            if (restaurante != null) {
                Recursos oldRecursosOfRestaurante = restaurante.getRecursos();
                if (oldRecursosOfRestaurante != null) {
                    oldRecursosOfRestaurante.setRestaurante(null);
                    oldRecursosOfRestaurante = em.merge(oldRecursosOfRestaurante);
                }
                restaurante.setRecursos(recursos);
                restaurante = em.merge(restaurante);
            }
            if (hotel != null) {
                Recursos oldRecursosOfHotel = hotel.getRecursos();
                if (oldRecursosOfHotel != null) {
                    oldRecursosOfHotel.setHotel(null);
                    oldRecursosOfHotel = em.merge(oldRecursosOfHotel);
                }
                hotel.setRecursos(recursos);
                hotel = em.merge(hotel);
            }
            for (Solicitudrecurso solicitudrecursoListSolicitudrecurso : recursos.getSolicitudrecursoList()) {
                Recursos oldRecursosOfSolicitudrecursoListSolicitudrecurso = solicitudrecursoListSolicitudrecurso.getRecursos();
                solicitudrecursoListSolicitudrecurso.setRecursos(recursos);
                solicitudrecursoListSolicitudrecurso = em.merge(solicitudrecursoListSolicitudrecurso);
                if (oldRecursosOfSolicitudrecursoListSolicitudrecurso != null) {
                    oldRecursosOfSolicitudrecursoListSolicitudrecurso.getSolicitudrecursoList().remove(solicitudrecursoListSolicitudrecurso);
                    oldRecursosOfSolicitudrecursoListSolicitudrecurso = em.merge(oldRecursosOfSolicitudrecursoListSolicitudrecurso);
                }
            }
            for (Vuelo vueloListVuelo : recursos.getVueloList()) {
                Recursos oldRecursosOfVueloListVuelo = vueloListVuelo.getRecursos();
                vueloListVuelo.setRecursos(recursos);
                vueloListVuelo = em.merge(vueloListVuelo);
                if (oldRecursosOfVueloListVuelo != null) {
                    oldRecursosOfVueloListVuelo.getVueloList().remove(vueloListVuelo);
                    oldRecursosOfVueloListVuelo = em.merge(oldRecursosOfVueloListVuelo);
                }
            }
            for (Reservarecurso reservarecursoListReservarecurso : recursos.getReservarecursoList()) {
                Recursos oldRecursosOfReservarecursoListReservarecurso = reservarecursoListReservarecurso.getRecursos();
                reservarecursoListReservarecurso.setRecursos(recursos);
                reservarecursoListReservarecurso = em.merge(reservarecursoListReservarecurso);
                if (oldRecursosOfReservarecursoListReservarecurso != null) {
                    oldRecursosOfReservarecursoListReservarecurso.getReservarecursoList().remove(reservarecursoListReservarecurso);
                    oldRecursosOfReservarecursoListReservarecurso = em.merge(oldRecursosOfReservarecursoListReservarecurso);
                }
            }
            for (Insumo insumoListInsumo : recursos.getInsumoList()) {
                Recursos oldRecursosOfInsumoListInsumo = insumoListInsumo.getRecursos();
                insumoListInsumo.setRecursos(recursos);
                insumoListInsumo = em.merge(insumoListInsumo);
                if (oldRecursosOfInsumoListInsumo != null) {
                    oldRecursosOfInsumoListInsumo.getInsumoList().remove(insumoListInsumo);
                    oldRecursosOfInsumoListInsumo = em.merge(oldRecursosOfInsumoListInsumo);
                }
            }
            for (Carro carroListCarro : recursos.getCarroList()) {
                Recursos oldRecursosOfCarroListCarro = carroListCarro.getRecursos();
                carroListCarro.setRecursos(recursos);
                carroListCarro = em.merge(carroListCarro);
                if (oldRecursosOfCarroListCarro != null) {
                    oldRecursosOfCarroListCarro.getCarroList().remove(carroListCarro);
                    oldRecursosOfCarroListCarro = em.merge(oldRecursosOfCarroListCarro);
                }
            }
            em.getTransaction().commit();
        } catch (Exception ex) {
            if (findRecursos(recursos.getIdrecurso()) != null) {
                throw new PreexistingEntityException("Recursos " + recursos + " already exists.", ex);
            }
            throw ex;
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

    public void edit(Recursos recursos) throws IllegalOrphanException, NonexistentEntityException, Exception {
        EntityManager em = null;
        try {
            em = getEntityManager();
            em.getTransaction().begin();
            Recursos persistentRecursos = em.find(Recursos.class, recursos.getIdrecurso());
            Lugar lugarOld = persistentRecursos.getLugar();
            Lugar lugarNew = recursos.getLugar();
            Tiporecursos tiporecursosOld = persistentRecursos.getTiporecursos();
            Tiporecursos tiporecursosNew = recursos.getTiporecursos();
            Proyecto proyectoOld = persistentRecursos.getProyecto();
            Proyecto proyectoNew = recursos.getProyecto();
            Restaurante restauranteOld = persistentRecursos.getRestaurante();
            Restaurante restauranteNew = recursos.getRestaurante();
            Hotel hotelOld = persistentRecursos.getHotel();
            Hotel hotelNew = recursos.getHotel();
            List<Solicitudrecurso> solicitudrecursoListOld = persistentRecursos.getSolicitudrecursoList();
            List<Solicitudrecurso> solicitudrecursoListNew = recursos.getSolicitudrecursoList();
            List<Vuelo> vueloListOld = persistentRecursos.getVueloList();
            List<Vuelo> vueloListNew = recursos.getVueloList();
            List<Reservarecurso> reservarecursoListOld = persistentRecursos.getReservarecursoList();
            List<Reservarecurso> reservarecursoListNew = recursos.getReservarecursoList();
            List<Insumo> insumoListOld = persistentRecursos.getInsumoList();
            List<Insumo> insumoListNew = recursos.getInsumoList();
            List<Carro> carroListOld = persistentRecursos.getCarroList();
            List<Carro> carroListNew = recursos.getCarroList();
            List<String> illegalOrphanMessages = null;
            if (lugarOld != null && !lugarOld.equals(lugarNew)) {
                if (illegalOrphanMessages == null) {
                    illegalOrphanMessages = new ArrayList<String>();
                }
                illegalOrphanMessages.add("You must retain Lugar " + lugarOld + " since its recursos field is not nullable.");
            }
            if (restauranteOld != null && !restauranteOld.equals(restauranteNew)) {
                if (illegalOrphanMessages == null) {
                    illegalOrphanMessages = new ArrayList<String>();
                }
                illegalOrphanMessages.add("You must retain Restaurante " + restauranteOld + " since its recursos field is not nullable.");
            }
            if (hotelOld != null && !hotelOld.equals(hotelNew)) {
                if (illegalOrphanMessages == null) {
                    illegalOrphanMessages = new ArrayList<String>();
                }
                illegalOrphanMessages.add("You must retain Hotel " + hotelOld + " since its recursos field is not nullable.");
            }
            for (Solicitudrecurso solicitudrecursoListOldSolicitudrecurso : solicitudrecursoListOld) {
                if (!solicitudrecursoListNew.contains(solicitudrecursoListOldSolicitudrecurso)) {
                    if (illegalOrphanMessages == null) {
                        illegalOrphanMessages = new ArrayList<String>();
                    }
                    illegalOrphanMessages.add("You must retain Solicitudrecurso " + solicitudrecursoListOldSolicitudrecurso + " since its recursos field is not nullable.");
                }
            }
            for (Reservarecurso reservarecursoListOldReservarecurso : reservarecursoListOld) {
                if (!reservarecursoListNew.contains(reservarecursoListOldReservarecurso)) {
                    if (illegalOrphanMessages == null) {
                        illegalOrphanMessages = new ArrayList<String>();
                    }
                    illegalOrphanMessages.add("You must retain Reservarecurso " + reservarecursoListOldReservarecurso + " since its recursos field is not nullable.");
                }
            }
            for (Carro carroListOldCarro : carroListOld) {
                if (!carroListNew.contains(carroListOldCarro)) {
                    if (illegalOrphanMessages == null) {
                        illegalOrphanMessages = new ArrayList<String>();
                    }
                    illegalOrphanMessages.add("You must retain Carro " + carroListOldCarro + " since its recursos field is not nullable.");
                }
            }
            if (illegalOrphanMessages != null) {
                throw new IllegalOrphanException(illegalOrphanMessages);
            }
            if (lugarNew != null) {
                lugarNew = em.getReference(lugarNew.getClass(), lugarNew.getRecursosIdrecurso());
                recursos.setLugar(lugarNew);
            }
            if (tiporecursosNew != null) {
                tiporecursosNew = em.getReference(tiporecursosNew.getClass(), tiporecursosNew.getIdtiporecurso());
                recursos.setTiporecursos(tiporecursosNew);
            }
            if (proyectoNew != null) {
                proyectoNew = em.getReference(proyectoNew.getClass(), proyectoNew.getCodigocongreso());
                recursos.setProyecto(proyectoNew);
            }
            if (restauranteNew != null) {
                restauranteNew = em.getReference(restauranteNew.getClass(), restauranteNew.getRecursosIdrecurso());
                recursos.setRestaurante(restauranteNew);
            }
            if (hotelNew != null) {
                hotelNew = em.getReference(hotelNew.getClass(), hotelNew.getRecursosIdrecurso());
                recursos.setHotel(hotelNew);
            }
            List<Solicitudrecurso> attachedSolicitudrecursoListNew = new ArrayList<Solicitudrecurso>();
            for (Solicitudrecurso solicitudrecursoListNewSolicitudrecursoToAttach : solicitudrecursoListNew) {
                solicitudrecursoListNewSolicitudrecursoToAttach = em.getReference(solicitudrecursoListNewSolicitudrecursoToAttach.getClass(), solicitudrecursoListNewSolicitudrecursoToAttach.getSolicitudrecursoPK());
                attachedSolicitudrecursoListNew.add(solicitudrecursoListNewSolicitudrecursoToAttach);
            }
            solicitudrecursoListNew = attachedSolicitudrecursoListNew;
            recursos.setSolicitudrecursoList(solicitudrecursoListNew);
            List<Vuelo> attachedVueloListNew = new ArrayList<Vuelo>();
            for (Vuelo vueloListNewVueloToAttach : vueloListNew) {
                vueloListNewVueloToAttach = em.getReference(vueloListNewVueloToAttach.getClass(), vueloListNewVueloToAttach.getNumeroVuelo());
                attachedVueloListNew.add(vueloListNewVueloToAttach);
            }
            vueloListNew = attachedVueloListNew;
            recursos.setVueloList(vueloListNew);
            List<Reservarecurso> attachedReservarecursoListNew = new ArrayList<Reservarecurso>();
            for (Reservarecurso reservarecursoListNewReservarecursoToAttach : reservarecursoListNew) {
                reservarecursoListNewReservarecursoToAttach = em.getReference(reservarecursoListNewReservarecursoToAttach.getClass(), reservarecursoListNewReservarecursoToAttach.getReservaCodigoreserva());
                attachedReservarecursoListNew.add(reservarecursoListNewReservarecursoToAttach);
            }
            reservarecursoListNew = attachedReservarecursoListNew;
            recursos.setReservarecursoList(reservarecursoListNew);
            List<Insumo> attachedInsumoListNew = new ArrayList<Insumo>();
            for (Insumo insumoListNewInsumoToAttach : insumoListNew) {
                insumoListNewInsumoToAttach = em.getReference(insumoListNewInsumoToAttach.getClass(), insumoListNewInsumoToAttach.getIdinsumo());
                attachedInsumoListNew.add(insumoListNewInsumoToAttach);
            }
            insumoListNew = attachedInsumoListNew;
            recursos.setInsumoList(insumoListNew);
            List<Carro> attachedCarroListNew = new ArrayList<Carro>();
            for (Carro carroListNewCarroToAttach : carroListNew) {
                carroListNewCarroToAttach = em.getReference(carroListNewCarroToAttach.getClass(), carroListNewCarroToAttach.getPlaca());
                attachedCarroListNew.add(carroListNewCarroToAttach);
            }
            carroListNew = attachedCarroListNew;
            recursos.setCarroList(carroListNew);
            recursos = em.merge(recursos);
            if (lugarNew != null && !lugarNew.equals(lugarOld)) {
                Recursos oldRecursosOfLugar = lugarNew.getRecursos();
                if (oldRecursosOfLugar != null) {
                    oldRecursosOfLugar.setLugar(null);
                    oldRecursosOfLugar = em.merge(oldRecursosOfLugar);
                }
                lugarNew.setRecursos(recursos);
                lugarNew = em.merge(lugarNew);
            }
            if (tiporecursosOld != null && !tiporecursosOld.equals(tiporecursosNew)) {
                tiporecursosOld.getRecursosList().remove(recursos);
                tiporecursosOld = em.merge(tiporecursosOld);
            }
            if (tiporecursosNew != null && !tiporecursosNew.equals(tiporecursosOld)) {
                tiporecursosNew.getRecursosList().add(recursos);
                tiporecursosNew = em.merge(tiporecursosNew);
            }
            if (proyectoOld != null && !proyectoOld.equals(proyectoNew)) {
                proyectoOld.getRecursosList().remove(recursos);
                proyectoOld = em.merge(proyectoOld);
            }
            if (proyectoNew != null && !proyectoNew.equals(proyectoOld)) {
                proyectoNew.getRecursosList().add(recursos);
                proyectoNew = em.merge(proyectoNew);
            }
            if (restauranteNew != null && !restauranteNew.equals(restauranteOld)) {
                Recursos oldRecursosOfRestaurante = restauranteNew.getRecursos();
                if (oldRecursosOfRestaurante != null) {
                    oldRecursosOfRestaurante.setRestaurante(null);
                    oldRecursosOfRestaurante = em.merge(oldRecursosOfRestaurante);
                }
                restauranteNew.setRecursos(recursos);
                restauranteNew = em.merge(restauranteNew);
            }
            if (hotelNew != null && !hotelNew.equals(hotelOld)) {
                Recursos oldRecursosOfHotel = hotelNew.getRecursos();
                if (oldRecursosOfHotel != null) {
                    oldRecursosOfHotel.setHotel(null);
                    oldRecursosOfHotel = em.merge(oldRecursosOfHotel);
                }
                hotelNew.setRecursos(recursos);
                hotelNew = em.merge(hotelNew);
            }
            for (Solicitudrecurso solicitudrecursoListNewSolicitudrecurso : solicitudrecursoListNew) {
                if (!solicitudrecursoListOld.contains(solicitudrecursoListNewSolicitudrecurso)) {
                    Recursos oldRecursosOfSolicitudrecursoListNewSolicitudrecurso = solicitudrecursoListNewSolicitudrecurso.getRecursos();
                    solicitudrecursoListNewSolicitudrecurso.setRecursos(recursos);
                    solicitudrecursoListNewSolicitudrecurso = em.merge(solicitudrecursoListNewSolicitudrecurso);
                    if (oldRecursosOfSolicitudrecursoListNewSolicitudrecurso != null && !oldRecursosOfSolicitudrecursoListNewSolicitudrecurso.equals(recursos)) {
                        oldRecursosOfSolicitudrecursoListNewSolicitudrecurso.getSolicitudrecursoList().remove(solicitudrecursoListNewSolicitudrecurso);
                        oldRecursosOfSolicitudrecursoListNewSolicitudrecurso = em.merge(oldRecursosOfSolicitudrecursoListNewSolicitudrecurso);
                    }
                }
            }
            for (Vuelo vueloListOldVuelo : vueloListOld) {
                if (!vueloListNew.contains(vueloListOldVuelo)) {
                    vueloListOldVuelo.setRecursos(null);
                    vueloListOldVuelo = em.merge(vueloListOldVuelo);
                }
            }
            for (Vuelo vueloListNewVuelo : vueloListNew) {
                if (!vueloListOld.contains(vueloListNewVuelo)) {
                    Recursos oldRecursosOfVueloListNewVuelo = vueloListNewVuelo.getRecursos();
                    vueloListNewVuelo.setRecursos(recursos);
                    vueloListNewVuelo = em.merge(vueloListNewVuelo);
                    if (oldRecursosOfVueloListNewVuelo != null && !oldRecursosOfVueloListNewVuelo.equals(recursos)) {
                        oldRecursosOfVueloListNewVuelo.getVueloList().remove(vueloListNewVuelo);
                        oldRecursosOfVueloListNewVuelo = em.merge(oldRecursosOfVueloListNewVuelo);
                    }
                }
            }
            for (Reservarecurso reservarecursoListNewReservarecurso : reservarecursoListNew) {
                if (!reservarecursoListOld.contains(reservarecursoListNewReservarecurso)) {
                    Recursos oldRecursosOfReservarecursoListNewReservarecurso = reservarecursoListNewReservarecurso.getRecursos();
                    reservarecursoListNewReservarecurso.setRecursos(recursos);
                    reservarecursoListNewReservarecurso = em.merge(reservarecursoListNewReservarecurso);
                    if (oldRecursosOfReservarecursoListNewReservarecurso != null && !oldRecursosOfReservarecursoListNewReservarecurso.equals(recursos)) {
                        oldRecursosOfReservarecursoListNewReservarecurso.getReservarecursoList().remove(reservarecursoListNewReservarecurso);
                        oldRecursosOfReservarecursoListNewReservarecurso = em.merge(oldRecursosOfReservarecursoListNewReservarecurso);
                    }
                }
            }
            for (Insumo insumoListOldInsumo : insumoListOld) {
                if (!insumoListNew.contains(insumoListOldInsumo)) {
                    insumoListOldInsumo.setRecursos(null);
                    insumoListOldInsumo = em.merge(insumoListOldInsumo);
                }
            }
            for (Insumo insumoListNewInsumo : insumoListNew) {
                if (!insumoListOld.contains(insumoListNewInsumo)) {
                    Recursos oldRecursosOfInsumoListNewInsumo = insumoListNewInsumo.getRecursos();
                    insumoListNewInsumo.setRecursos(recursos);
                    insumoListNewInsumo = em.merge(insumoListNewInsumo);
                    if (oldRecursosOfInsumoListNewInsumo != null && !oldRecursosOfInsumoListNewInsumo.equals(recursos)) {
                        oldRecursosOfInsumoListNewInsumo.getInsumoList().remove(insumoListNewInsumo);
                        oldRecursosOfInsumoListNewInsumo = em.merge(oldRecursosOfInsumoListNewInsumo);
                    }
                }
            }
            for (Carro carroListNewCarro : carroListNew) {
                if (!carroListOld.contains(carroListNewCarro)) {
                    Recursos oldRecursosOfCarroListNewCarro = carroListNewCarro.getRecursos();
                    carroListNewCarro.setRecursos(recursos);
                    carroListNewCarro = em.merge(carroListNewCarro);
                    if (oldRecursosOfCarroListNewCarro != null && !oldRecursosOfCarroListNewCarro.equals(recursos)) {
                        oldRecursosOfCarroListNewCarro.getCarroList().remove(carroListNewCarro);
                        oldRecursosOfCarroListNewCarro = em.merge(oldRecursosOfCarroListNewCarro);
                    }
                }
            }
            em.getTransaction().commit();
        } catch (Exception ex) {
            String msg = ex.getLocalizedMessage();
            if (msg == null || msg.length() == 0) {
                Integer id = recursos.getIdrecurso();
                if (findRecursos(id) == null) {
                    throw new NonexistentEntityException("The recursos with id " + id + " no longer exists.");
                }
            }
            throw ex;
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

    public void destroy(Integer id) throws IllegalOrphanException, NonexistentEntityException {
        EntityManager em = null;
        try {
            em = getEntityManager();
            em.getTransaction().begin();
            Recursos recursos;
            try {
                recursos = em.getReference(Recursos.class, id);
                recursos.getIdrecurso();
            } catch (EntityNotFoundException enfe) {
                throw new NonexistentEntityException("The recursos with id " + id + " no longer exists.", enfe);
            }
            List<String> illegalOrphanMessages = null;
            Lugar lugarOrphanCheck = recursos.getLugar();
            if (lugarOrphanCheck != null) {
                if (illegalOrphanMessages == null) {
                    illegalOrphanMessages = new ArrayList<String>();
                }
                illegalOrphanMessages.add("This Recursos (" + recursos + ") cannot be destroyed since the Lugar " + lugarOrphanCheck + " in its lugar field has a non-nullable recursos field.");
            }
            Restaurante restauranteOrphanCheck = recursos.getRestaurante();
            if (restauranteOrphanCheck != null) {
                if (illegalOrphanMessages == null) {
                    illegalOrphanMessages = new ArrayList<String>();
                }
                illegalOrphanMessages.add("This Recursos (" + recursos + ") cannot be destroyed since the Restaurante " + restauranteOrphanCheck + " in its restaurante field has a non-nullable recursos field.");
            }
            Hotel hotelOrphanCheck = recursos.getHotel();
            if (hotelOrphanCheck != null) {
                if (illegalOrphanMessages == null) {
                    illegalOrphanMessages = new ArrayList<String>();
                }
                illegalOrphanMessages.add("This Recursos (" + recursos + ") cannot be destroyed since the Hotel " + hotelOrphanCheck + " in its hotel field has a non-nullable recursos field.");
            }
            List<Solicitudrecurso> solicitudrecursoListOrphanCheck = recursos.getSolicitudrecursoList();
            for (Solicitudrecurso solicitudrecursoListOrphanCheckSolicitudrecurso : solicitudrecursoListOrphanCheck) {
                if (illegalOrphanMessages == null) {
                    illegalOrphanMessages = new ArrayList<String>();
                }
                illegalOrphanMessages.add("This Recursos (" + recursos + ") cannot be destroyed since the Solicitudrecurso " + solicitudrecursoListOrphanCheckSolicitudrecurso + " in its solicitudrecursoList field has a non-nullable recursos field.");
            }
            List<Reservarecurso> reservarecursoListOrphanCheck = recursos.getReservarecursoList();
            for (Reservarecurso reservarecursoListOrphanCheckReservarecurso : reservarecursoListOrphanCheck) {
                if (illegalOrphanMessages == null) {
                    illegalOrphanMessages = new ArrayList<String>();
                }
                illegalOrphanMessages.add("This Recursos (" + recursos + ") cannot be destroyed since the Reservarecurso " + reservarecursoListOrphanCheckReservarecurso + " in its reservarecursoList field has a non-nullable recursos field.");
            }
            List<Carro> carroListOrphanCheck = recursos.getCarroList();
            for (Carro carroListOrphanCheckCarro : carroListOrphanCheck) {
                if (illegalOrphanMessages == null) {
                    illegalOrphanMessages = new ArrayList<String>();
                }
                illegalOrphanMessages.add("This Recursos (" + recursos + ") cannot be destroyed since the Carro " + carroListOrphanCheckCarro + " in its carroList field has a non-nullable recursos field.");
            }
            if (illegalOrphanMessages != null) {
                throw new IllegalOrphanException(illegalOrphanMessages);
            }
            Tiporecursos tiporecursos = recursos.getTiporecursos();
            if (tiporecursos != null) {
                tiporecursos.getRecursosList().remove(recursos);
                tiporecursos = em.merge(tiporecursos);
            }
            Proyecto proyecto = recursos.getProyecto();
            if (proyecto != null) {
                proyecto.getRecursosList().remove(recursos);
                proyecto = em.merge(proyecto);
            }
            List<Vuelo> vueloList = recursos.getVueloList();
            for (Vuelo vueloListVuelo : vueloList) {
                vueloListVuelo.setRecursos(null);
                vueloListVuelo = em.merge(vueloListVuelo);
            }
            List<Insumo> insumoList = recursos.getInsumoList();
            for (Insumo insumoListInsumo : insumoList) {
                insumoListInsumo.setRecursos(null);
                insumoListInsumo = em.merge(insumoListInsumo);
            }
            em.remove(recursos);
            em.getTransaction().commit();
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

    public List<Recursos> findRecursosEntities() {
        return findRecursosEntities(true, -1, -1);
    }

    public List<Recursos> findRecursosEntities(int maxResults, int firstResult) {
        return findRecursosEntities(false, maxResults, firstResult);
    }

    private List<Recursos> findRecursosEntities(boolean all, int maxResults, int firstResult) {
        EntityManager em = getEntityManager();
        try {
            CriteriaQuery cq = em.getCriteriaBuilder().createQuery();
            cq.select(cq.from(Recursos.class));
            Query q = em.createQuery(cq);
            if (!all) {
                q.setMaxResults(maxResults);
                q.setFirstResult(firstResult);
            }
            return q.getResultList();
        } finally {
            em.close();
        }
    }

    public Recursos findRecursos(Integer id) {
        EntityManager em = getEntityManager();
        try {
            return em.find(Recursos.class, id);
        } finally {
            em.close();
        }
    }

    public int getRecursosCount() {
        EntityManager em = getEntityManager();
        try {
            CriteriaQuery cq = em.getCriteriaBuilder().createQuery();
            Root<Recursos> rt = cq.from(Recursos.class);
            cq.select(em.getCriteriaBuilder().count(rt));
            Query q = em.createQuery(cq);
            return ((Long) q.getSingleResult()).intValue();
        } finally {
            em.close();
        }
    }

}
